package com.Algorithm.leetcode.Demo01;



/*
* 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
* 示例1:   // 此时我先回忆subString操作 ---我应该把所有子字符串遍历出来--这时我有父以及所有子字符串
*           1.如果采用子字符串包含子的方式?  比如abd 包a
*           2. 如果我把每个元素都整出来,然后我可以得到 a b c  然后使用它们进行组合,然后在与原函数比较,即可出答案?
*           3.如何组合? ab ba  abc acb // bac bca //cab cba
*           4.直接通过长度比较,如果子字符串的长度,同它解析出来的元素长度相同,那么就可以了

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是"wke"，所以其长度为 3。
    请注意，你的答案必须是 子串 的长度，"pwke"是一个子序列，不是子串。
示例 4:

输入: s = ""
输出: 0

*
*
*
*
* */


import java.util.HashSet;
import java.util.Set;

public class NoRepeatSubStringTest {
    public static void main(String[] args) {
        String ParentString = "abcssdasd";
        // 想个办法把它们都拆出来


        String SonString;
/*

        Set set = new HashSet();
        for (int i = 0; i < ParentString.length(); i++) {
            set.add(ParentString.charAt(i));
        }

        System.out.println(set.toString());
*/



            for (int i = ParentString.length(); i >=0; i--) {
                SonString = ParentString.substring(0,i);
                if(SonString.length()==RealityLen(SonString)){
                    System.out.println(SonString.toString()+SonString.length());
                    break;
                }
            }


/*

        if(SonString.length()==RealityLen(SonString)){
            System.out.println(SonString.length());
        }
*/

        // 怎么组合 如果能将a固定 然后其它能乱序或者按某种方式进行全序列排序
        // abcsd bacsd bcasd bcsad bcsda ----a的冒泡
        // acbsd acsbd acsdb



        // 如果子字符包含基础元素,并且长度符合,那么就行了啊..
        // if son.length == 方法的leng---解决


        Solution1 solution1 = new Solution1();
        System.out.println(solution1.lengthOfLongestSubstring("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ "));


    }


    public static int RealityLen(String ss){
        Set set = new HashSet();
        for (int i = 0; i < ss.length(); i++) {
            set.add(ss.charAt(i));
        }
        return set.size();
    }














}


class Solution1 {
    public int lengthOfLongestSubstring(String s) {

        String ParentString = s;
        // 想个办法把它们都拆出来

        String SonString;
        
        int len = 0;

        int MaxLen = 0;
        if(ParentString.length()==0){
            MaxLen = 0;
        }

        // { [---] }   凭借length和i,先试下固定总-1个数  内部移动:i length-i  外部锁块

      for (int j =ParentString.length(); j>0; j--) {   // 15 长度 --现在14 跑两次  --现在13 跑3次
            for (int i = 0; i+j <=ParentString.length(); i++) {  // 控制移动
                SonString = ParentString.substring(i,j+i); // 内部锁块
                if(SonString.length()==RealityLen(SonString)){
                    len = SonString.length();
                    MaxLen = MaxLen<len ? len:MaxLen;

                }
            }

        }


        return MaxLen;

    }

    public static int RealityLen(String ss){
        Set set = new HashSet();
        for (int i = 0; i < ss.length(); i++) {
            set.add(ss.charAt(i));
        }
        return set.size();


    }

}